﻿using System;
using System.Configuration;
using System.IO;
using ClickLand.CorporacionPlaza.Presentacion.Contratos.AdministracionPoliza;
using ClickLand.CorporacionPlaza.Presentacion.Controladores;
using ClickLand.CorporacionPlaza.Presentacion.CorporacionPlazaWS;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace ClickLand.CorporacionPlaza.Presentacion.Presentadores.AdministracionPoliza
{
    /// <summary> Presentador de la vitsa que consulta la lista de polizas </summary>
    public class PresentadorConsultarPolizas : PresentadorBase
    {
        
        #region Atributos

        /// <summary> Objeto que posee la definicion del controlador del modulo </summary>
        private ControladorAdministracionContrato _controlador;


        /// <summary> Objeto que posee la definicion de las propiedades de la vista </summary>
        private readonly IConsultarPolizas _vista;

        #endregion

        #region Constructor

        /// <summary> Constructor de la clase </summary>
        /// <param name="vista"> Objeto que posee las propiedades de la vista</param>
        public PresentadorConsultarPolizas(IConsultarPolizas vista)
        {
            _vista = vista;
            _controlador = new ControladorAdministracionContrato();
        }

        #endregion

        #region Metodos

        /// <summary> Metodo que realiza las operaciones para cargar la pagina </summary>
        public void CargarPagina()
        {
            var contrato = new ContratoDto {Estado = 1};
            _vista.ListaContratos = _controlador.BuscarContrato(contrato);
        }

        
        /// <summary> Metodo que se encarga de buscar las ventas dados los parametros indicados </summary>
        public void BuscarPoliza()
        {
            var contrato = new ContratoDto();

            if (_vista.ContratoSeleccionado != null)
                contrato.Id = _vista.ContratoSeleccionado.Id;
            if (_vista.TipoEstablecimiento != -1)
                contrato.Establecimiento = new EstablecimientoDto {Id = _vista.TipoEstablecimiento};
            contrato.Estado = _vista.Estado;

            var lista = _controlador.BuscarPolizas(contrato);
            _vista.ListaPolizas = lista;
        }


        /// <summary> Metodo que realiza la operacion para imprimir los reportes </summary>
        public void ImprimirReporte()
        {
            Document document = new Document();
            PdfWriter writer = PdfWriter.GetInstance(document,
                                  new FileStream(ConfigurationManager.AppSettings["RutaDescarga"] + 
                                      "ReporteConsultaPolizas.pdf", FileMode.Create));
            PdfPTable tabla;
            PdfPCell celdaTitulo;
            string[] titulosCeldas;
            Paragraph ptitulo;
            Chunk titulo; 

            try
            {
                document.SetMargins(36, 36, 36, 100);
                document.Open();
                

                #region Cuerpo del Reporte


                #region Tabla Historico Planes


                #region Titulo de Tabla
                titulo = new Chunk("Polizas \n\n",
                                         FontFactory.GetFont("Verdana", 11, Font.BOLD));
                ptitulo = new Paragraph();
                ptitulo.Alignment = Element.ALIGN_CENTER;
                ptitulo.Add(titulo);
                document.Add(ptitulo);
                #endregion

                var lista = _vista.ListaPolizas;
                if (lista.Count > 0)
                {
                    #region Encabezado de la tabla
                    tabla = new PdfPTable(8);
                    //tabla.SpacingBefore = 10;
                    tabla.WidthPercentage = 100;
                    tabla.HorizontalAlignment = Element.ALIGN_LEFT;
                    titulosCeldas = _vista.TituloReporte.Split(';');


                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[0], FontFactory.GetFont("Verdana", 10, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;
               
                    tabla.AddCell(celdaTitulo);
                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[1], FontFactory.GetFont("Verdana", 10, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;
                    tabla.AddCell(celdaTitulo);
                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[2], FontFactory.GetFont("Verdana", 10, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;
                    tabla.AddCell(celdaTitulo);
                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[3], FontFactory.GetFont("Verdana", 10, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;
                    tabla.AddCell(celdaTitulo);
                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[4], FontFactory.GetFont("Verdana", 10, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;
                    tabla.AddCell(celdaTitulo);
                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[5], FontFactory.GetFont("Verdana", 10, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;
                    tabla.AddCell(celdaTitulo);
                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[6], FontFactory.GetFont("Verdana", 10, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;
                    tabla.AddCell(celdaTitulo);
                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[7], FontFactory.GetFont("Verdana", 10, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;
                    tabla.AddCell(celdaTitulo);
                    #endregion

                    #region Cuerpo de la Tabla


                    foreach (var poliza in lista)
                    {
                        BaseColor color = ((poliza.Estado == 0 )|| (poliza.FechaFin < DateTime.Now)) ? BaseColor.RED : BaseColor.WHITE;
                        PdfPCell celdaContenido = new PdfPCell(new Phrase(poliza.Contratos[0].Establecimiento.Numero, FontFactory.GetFont("Verdana", 8)));
                        celdaContenido.HorizontalAlignment = Element.ALIGN_CENTER;
                        celdaContenido.BackgroundColor = color;
                        tabla.AddCell(celdaContenido);

                        celdaContenido = new PdfPCell(new Phrase(poliza.Contratos[0].Cliente.Nombre, FontFactory.GetFont("Verdana", 8)));
                        celdaContenido.HorizontalAlignment = Element.ALIGN_CENTER;
                        celdaContenido.BackgroundColor = color;
                        tabla.AddCell(celdaContenido);

                        celdaContenido = new PdfPCell(new Phrase(poliza.Aseguradora, FontFactory.GetFont("Verdana", 8)));
                        celdaContenido.HorizontalAlignment = Element.ALIGN_CENTER;
                        celdaContenido.BackgroundColor = color;
                        tabla.AddCell(celdaContenido);

                        celdaContenido = new PdfPCell(new Phrase(poliza.Beneficiario, FontFactory.GetFont("Verdana", 8)));
                        celdaContenido.HorizontalAlignment = Element.ALIGN_CENTER;
                        celdaContenido.BackgroundColor = color;
                        tabla.AddCell(celdaContenido);

                        celdaContenido = new PdfPCell(new Phrase(poliza.Monto.ToString("N"), FontFactory.GetFont("Verdana", 8)));
                        celdaContenido.HorizontalAlignment = Element.ALIGN_CENTER;
                        celdaContenido.BackgroundColor = color;
                        tabla.AddCell(celdaContenido);

                        celdaContenido = new PdfPCell(new Phrase(poliza.FechaEmision.ToString("dd/MM/yyyy"), FontFactory.GetFont("Verdana", 8)));
                        celdaContenido.HorizontalAlignment = Element.ALIGN_CENTER;
                        celdaContenido.BackgroundColor = color;
                        tabla.AddCell(celdaContenido);

                        celdaContenido = new PdfPCell(new Phrase(poliza.FechaFin.ToString("dd/MM/yyyy"), FontFactory.GetFont("Verdana", 8)));
                        celdaContenido.HorizontalAlignment = Element.ALIGN_CENTER;
                        celdaContenido.BackgroundColor = color;
                        tabla.AddCell(celdaContenido);

                        celdaContenido = new PdfPCell(new Phrase(((poliza.Estado == 0) || (poliza.FechaFin < DateTime.Now)) ?  "Vencida" : "Vigente" , FontFactory.GetFont("Verdana", 8)));
                        celdaContenido.HorizontalAlignment = Element.ALIGN_CENTER;
                        celdaContenido.BackgroundColor = color;
                        tabla.AddCell(celdaContenido);
                    }

                    document.Add(tabla);

                    #endregion
                }
                else
                {

                    Paragraph parrafo = new Paragraph(new Chunk("No Existe Polizas \n\n",
                                                                FontFactory.GetFont("Verdana", 10, Font.BOLD)));
                    parrafo.Alignment = Element.ALIGN_CENTER;
                    document.Add(parrafo);   
                }
                
                
                #endregion

                
                #endregion

                #region Agrego funcion javascript para que se abra el dialogo de impresión

                string jsText =
                    "var res = app.setTimeOut('var pp = this.getPrintParams();pp.interactive = pp.constants.interactionLevel.full;this.print(pp);', 200);";
                PdfAction js = PdfAction.JavaScript(jsText, writer);
                writer.AddJavaScript(js);

                #endregion

                document.Close();
            }
            catch (Exception e)
            {
                if (document.IsOpen())
                    document.Close();
            }
        }

        
        #endregion
    }
}
